
CROSS_COMPILE_PREFIX = 
MODE := DEBUG

# 指定递归查找的源文件路径src
SRC_DIR :=src
# 指定编译路径，编译中会替换SRC_DIR为TMP_DIR生成.o .d 文件
TMP_DIR :=obj
# 指定目标文件名
USER_BIN_NAME := out.elf

# 排除不想编译的文件夹格式如下： 
# 排除单文件夹 \( -path ./a \) -prune -o
# 排除多文件夹 \( -path ./a -o -path ./b -o -path ./c/d.txt \) -prune -o
EXCLUDE_DIR := \( -path $(SRC_DIR)/lvgl/demos -o -path $(SRC_DIR)/lvgl/examples \) -prune -o
EXCLUDE_C_DIR :=
EXCLUDE_H_DIR :=

SRC_FILES := $(shell find $(SRC_DIR) $(EXCLUDE_DIR) $(EXCLUDE_C_DIR) -name "*.c" -print)
HEADERS := $(shell find $(SRC_DIR) $(EXCLUDE_DIR) $(EXCLUDE_H_DIR) -name "*.h" -print)
# $(warning SRC_FILES : $(SRC_FILES))
# $(warning HEADERS : $(HEADERS))

INC_PATH := $(sort $(dir $(HEADERS))) # 提取头文件所在的目录并去重
INCLUDE_FLAGS := $(foreach dir,$(HEADER_PATHS),-I$(dir)) # 将头文件路径转换为编译器选项（-I 选项）

TMP_FILES := $(patsubst $(SRC_DIR)/%,$(TMP_DIR)/%, $(SRC_FILES)) # patsubst返回被替换过后的字符串
OBJ_FILES := $(TMP_FILES:.c=.o)
DEP_FILES := $(OBJ_FILES:.o=.d)

# $(warning SRC_FILES : $(SRC_FILES))
# $(warning OBJ_FILES : $(OBJ_FILES))
#FLAGS := -Wall -Werror
FLAGS :=
FLAGS += $(addprefix -I ,$(INC_PATH))
FLAGS += -std=gnu99

# $(warning FLAGS : $(FLAGS))

ifeq ($(MODE), DEBUG)
FLAGS += -g -MMD
else
FLAGS += -O2 -DNDEBUG
endif

LDFLAGS += -Wl,--copy-dt-needed-entries -lpthread -lm -lSDL2

.PHONY : all clean

all : $(USER_BIN_NAME)

# @echo -e 'target: $@, deps: $^ '
# @echo -e 'target: $@, deps: $^, flag: $(FLAGS) '
$(TMP_DIR)/%.o: $(SRC_DIR)/%.c
	$(shell if [ ! -d $(dir $@) ];then mkdir -p $(dir $@); fi)
	@$(CROSS_COMPILE_PREFIX)gcc -c -o $@ $(FLAGS) $< 
	@echo -e '\033[32m"compiling gcc" : $<\033[0m'


-include $(DEP_FILES)
$(USER_BIN_NAME) : $(OBJ_FILES)
	$(shell if [ ! -d $(dir $@) ];then mkdir -p $(dir $@); fi)
	$(CROSS_COMPILE_PREFIX)gcc -o $@ $^ $(LDFLAGS)

	
clean :
	@echo -e '\033[32m"clean"\033[0m'
	@rm -rf $(shell find -name "*.o")
	@rm -rf $(shell find -name "*.d")
	@rm -rf $(USER_BIN_NAME)
	

